关于Apache Hadoop的介绍以本地模式、伪分布式安装部署请参见上篇博文,本篇博文主要记录完全分布式部署,并实现NameNode高可用和ResourceManager高可用。
环境规划
主机名 | IP地址 | 操作系统版本 | 安装软件 | 运行的进程 |
---|---|---|---|---|
hadoop16 | 172.16.206.16 | CentOS 7.2 | JDK1.7、hadoop-2.7.2 | NameNode、DFSZKFailoverController(zkfc)、ResourceManager |
hadoop26 | 172.16.206.26 | CentOS 7.2 | JDK1.7、hadoop-2.7.2 | NameNode、DFSZKFailoverController(zkfc)、ResourceManager |
hadoop27 | 172.16.206.27 | CentOS 7.2 | JDK1.7、hadoop-2.7.2、Zookeeper | DataNode、NodeManager、JournalNode、QuorumPeerMain |
hadoop28 | 172.16.206.28 | CentOS 7.2 | JDK1.7、hadoop-2.7.2、Zookeeper | DataNode、NodeManager、JournalNode、QuorumPeerMain |
hadoop29 | 172.16.206.29 | CentOS 7.2 | JDK1.7、hadoop-2.7.2、Zookeeper | DataNode、NodeManager、JournalNode、QuorumPeerMain |
注意:这里由于机器紧张,将NameNode和ResourceManager安装在一台机器上。在hadoop16主机上安装NameNode和ResourceManager使其处于active状态,在hadoop26上安装NameNode和ResourceManager使其处于standby状态。
环境拓扑:
注意:这里由于实验环境,所以将NameNode和ResourceManager放在了一起,生产环境下应该将NameNode和ResourceManager放在单独的机器上。
Hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这两种共享数据的方案,NFS是操作系统层面的,JournalNode是hadoop层面的,这里我们使用简单的QJM集群进行数据共享。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode。
另外还配置了一个zookeeper集群(27,28,29主机),用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode和ResourceManager为standby状态。同时27,28,29主机作为DataNode节点。
配置集群各节点hosts文件
在各节点,编辑hosts文件,配置好各节点主机名和ip地址的对应关系:
安装JDK1.7
Hadoop Java Versions
Version 2.7 and later of Apache Hadoop requires Java 7. It is built and tested on both OpenJDK and Oracle (HotSpot)’s JDK/JRE.
Earlier versions (2.6 and earlier) support Java 6.
安装依赖包ssh和rsync
对于Redhat/CentOS系列的,安装系统时一般都会默认安装openssh软件,里面包含了ssh客户端和ssh服务端,所以先检查下这个软件包是否安装了:
如果没有安装,安装:
在检查rsync软件包是否安装:
各节点时间同步
采用NTP(Network Time Protocol)方式来实现, 选择一台机器, 作为集群的时间同步服务器, 然后分别配置服务端和集群其他机器。我这里以hadoop16机器时间为准,其他机器同这台机器时间做同步。
NTP服务端
1.安装ntp服务
2.配置/etc/ntp.conf,这边采用本地机器作为时间的原点
注释server列表:
添加如下内容:
3.启动ntpd服务
4.查看ntp服务状态
5.加入开机启动
NTP客户端
1.安装ntp
2.配置crontab任务主动同步
安装Zookeeper集群
注意:对于Zookeeper集群的话,官方推荐的最小节点数为3个。
安装配置zk
1.配置zk节点的hosts文件
配置zk节点的hosts文件:配置3台机器的ip地址和主机名的对应关系。上面已经做过了。这里选择3台安装zk:hadoop27,hadoop28,hadoop29。
2.解压安装配置第一台zk
注意:如果不配置dataLogDir,那么事务日志也会写在dataDir目录中。这样会严重影响zk的性能。因为在zk吞吐量很高的时候,产生的事务日志和快照日志太多。
在我们配置的dataDir指定的目录下面,创建一个myid文件,里面内容为一个数字,用来标识当前主机,conf/zoo.cfg文件中配置的server.X中X为什么数字,则myid文件中就输入这个数字:
hadoop27主机:
3.远程复制第一台的zk到另外两台上,并修改myid文件为2和3
启动和关闭zk
在ZooKeeper集群的每个结点上,执行启动ZooKeeper服务的脚本,如下所示:
查看启动的进程:
停止zk命令:
测试zk集群
可以通过ZooKeeper的脚本来查看启动状态,包括集群中各个结点的角色(或是Leader,或是Follower):
|
|
|
|
通过上面状态查询结果可见,hadoop28是集群的Leader,其余的两个结点是Follower。
另外,可以通过客户端脚本,连接到ZooKeeper集群上。对于客户端来说,ZooKeeper是一个整体,连接到ZooKeeper集群实际上感觉在独享整个集群的服务,所以,你可以在任何一个结点上建立到服务集群的连接。
输入quit,可以退出。
脚本定期清理zk快照和日志文件
正常运行过程中,ZK会不断地把快照数据和事务日志输出到dataDir和dataLogDir这两个目录,并且如果没有人为操作的话,ZK自己是不会清理这些文件的。
我这里采用脚本切割。将脚本上传到/usr/local/zookeeper-3.4.6/目录下。脚本内容如下:
赋予脚本执行权限:
配置周期性任务,每个星期日的0点0分执行:
注意:所有zk节点都得配置脚本和周期性任务。
添加Hadoop运行用户
|
|
注意:所有节点都得添加hadoop用户。
配置主节点登录自己和其他节点不需要输入密码
这里的主节点指的是NameNode,ResourceManager。配置hadoop16主机(Active)登录hadoop16,hadoop26,hadoop27,hadoop28,hadoop29主机免密码。还要配置hadoop26主机(Standby)登录hadoop16,hadoop26,hadoop27,hadoop28,hadoop29主机免密码。 (也可以不配置,每个节点一个一个启动服务,最好不要这样做)。
hadoop用户登录shell:
1.配置hadoop16主机(Active)登录hadoop16,hadoop26,hadoop27,hadoop28,hadoop29主机免密码
2.配置hadoop26主机(Standby)登录hadoop16,hadoop26,hadoop27,hadoop28,hadoop29主机免密码
安装hadoop
安装配置master节点(hadoop16主机)
1.将安装包上传至/usr/local目录下并解压
2.配置hadoop环境变量
3.修改文件hadoop-env.sh
Hadoop的各守护进程依赖于JAVA_HOME环境变量,可在这两个文件中配置特定的JAVA环境。此处仅需要修改hadoop-env.sh文件。此外,Hadoop大多数守护进程默认使用的堆大小为1GB,但现实应用中,可能需要对其各类进程的堆内存大小做出调整,这只需要编辑这两个文件中的相关环境变量值即可,例如HADOOP_HEAPSIZE、HADOOP_JOB_HISTORY_HEAPSIZE、JAVA_HEAP_SIZE和YARN_HEAP_SIZE等。
hadoop用户登录shell,或者root用户登录,su - hadoop。
4.修改配置文件
hadoop用户登录shell,或者root用户登录,su - hadoop。
修改core-site.xml,该文件包含了NameNode主机地址以及其监听RPC端口等信息,对于伪分布式模式的安装来说,其主机地址是localhost;对于完全分布式中master节点的主机名称或者ip地址;如果配置NameNode是HA,指定HDFS的nameservice为一个自定义名称,然后在hdfs-site.xml配置NameNode节点的主机信息。NameNode默认的RPC端口是8020。
修改hdfs-site.xml,该文件主要用于配置HDFS相关的属性,例如复制因子(即数据块的副本数)、NN和DN用于存储数据的目录等。数据块的副本数对于伪分布式的Hadoop应该为1,完全分布式模式下默认数据副本是3份。在这个配置文件中还可以配置NN和DN用于存储的数据的目录。
注意:如果需要其它用户对hdfs有写入权限,还需要在hdfs-site.xml添加一项属性定义。
修改mapred-site.xml,该文件用于配置集群的MapReduce framework,此处应该指定yarn,另外的可用值还有local和classic。mapred-site.xml默认是不存在,但有模块文件mapred-site.xml.template,只需要将其复制mapred-site.xml即可。
|
|
修改yarn-site.xml,该文件用于配置YARN进程及YARN的相关属性。首先需要指定ResourceManager守护进程的主机和监听的端口,对于伪分布式模型来来讲,其主机为localhost,默认的端口是8032;其次需要指定ResourceManager使用的scheduler,以及NodeManager的辅助服务。
修改slaves,该文件存储了当前集群的所有slave节点的列表,对于伪分布式模型,其文件内容仅应该是你localhost,这也的确是这个文件的默认值。
Hadoop启动后,会把进程的PID号存储在一个文件中,这样执行stop-dfs脚本时就可以按照进程PID去关闭进程了。而这个默认路径就是/tmp,/tmp目录下的文件系统会定期清理,所以需要修改pid存放的路径:
修改hadoop-daemon.sh:
[hadoop@hadoop16 ~]$ cd /usr/local/hadoop/sbin/
[hadoop@hadoop16 sbin]$ vim hadoop-daemon.sh
HADOOP_PID_DIR=/usr/local/hadoop
修改yarn-daemon.sh:
[hadoop@hadoop16 ~]$ cd /usr/local/hadoop/sbin/
[hadoop@hadoop16 sbin]$ vim yarn-daemon.sh
YARN_PID_DIR=/usr/local/hadoop
【注意】:每个节点的这两个文件都得修改。
安装配置其他节点
注意:这里由于节点数目少,没有使用ansible等自动化工具。
重复操作解压、配置环境变量,参照前面。
Hadoop集群的各节点配置文件都是一样的,我们可以将master节点上的配置文件scp到其他节点上:
启动hadoop
注意:请严格按照下面的步骤启动。
启动Zookeeper集群
分别在hadoop27、hadoop28、hadoop29上启动zk,前面已经启动好了,不再重复。
启动journalnode
hadoop用户登录shell,分别在在hadoop27、hadoop28、hadoop29上执行:
运行jps命令检验,hadoop27、hadoop28、hadoop29上多了JournalNode进程。
格式化HDFS
在HDFS的NN启动之前需要先初始化其用于存储数据的目录,可以在hdfs-site.xml配置文件中使用dfs.namenode.name.dir属性定义HDFS元数据持久存储路径,默认为${hadoop.tmp.dir}/dfs/name,这里是存放在JournalNode中;dfs.datanode.data.dir属性定义DataNode用于存储数据块的目录路径,默认为${hadoop.tmp.dir}/dfs/data。如果指定的目录不存在,格式化命令会自动创建之;如果事先存在,请确保其权限设置正确,此时格式化操作会清除其内部的所有数据并重新建立一个新的文件系统。
在hadoop16(Active)上执行命令:
格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/usr/local/hadoop/tmp。
启动hadoop16主机上的NameNode:
然后在hadoop26(Standby)主机上执行如下命令,同步hadoop16主机上的NameNode元数据信息:
同步完成后,停止hadoop16主机上的NameNode:
这里如果不启动Active的NameNode,就在Standby主机上同步,会报如下的错误:
这是因为没有启动active namenode,因为standby namenode是通过active namenode的9000端口通讯的。若active namenode没有启动,则9000没有程序监听提供服务。
当然也可以不启动Active NameNode就进行同步元数据信息,就是直接用命令拷贝Active主机上的元数据信息目录到Standby主机上,但是不建议这么做:
格式化ZKFC(仅在hadoop16上执行即可)
|
|
启动HDFS(在hadoop16上执行)
|
|
可以在各主机执行jps,查看启动的进程:
启动YARN
注意:还是在hadoop16上执行start-yarn.sh,这是因为没有把namenode和resourcemanager分开,生产环境需要把他们分开,他们分开了就要分别在不同的机器上启动。
启动yarn(在hadoop16上):
启动yarn standby(在hadoop26上):
可以在各节点执行jps,查看启动的进程:
停止hadoop
停止HDFS集群:
停止YARN集群:
停止ResourceManager(Standby):